<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script type="text/javascript">
    // 一个用于产生对象的简单函数
    function factory(name) {
        return {
            name: name
        };
    }

    // 调用factory函数来生成对象
    var o = factory('one');
    console.log(o.name);
    console.log(o.constructor);

    // 实际上，构造器函数也是可以返回对象的，只不过在this值得使用上会有所不同，这意味我们需要修改构造器函数的默认行为。

    // 构造器一般用法是这样的
    function C() {
        this.a = 1;
    }

    var c = new C();
    console.log(c.a);

    // 但现在要考虑的是这种用法
    function C2() {
        this.a = 1;
        return {b: 2};
    }

    var c2 = new C2();
    console.log(typeof c2.a);
    console.log(c2.b);

    // 在这里，构造器返回的不再是包含属性a的this对象，而是另一个包含属性b的对象（这里return语句中使用的是大括号，也就是说{b: 2}是一个独立的对象）。但这也只有在函数的返回值是是一个对象时才会发生，而当我们企图返回的是一个非对象类型时，该构造器将会照常返回this。

    // 关于对象在构造器函数内部是如何创建出来的，你可以设想在函数开头处存在一个叫做this的变量，这个变量会在函数结束时被返回
    function C() {
        // var this = {};
        this.a = 1;
        // return this;
    }
</script>
</body>
</html>
